const ncname = `[a-zA-Z_][\\-\\.0-9_a-zA-Z]*`;
const qnameCapture = `((?:${ncname}\\:)?${ncname})`;
const startTagOpen = new RegExp(`^<${qnameCapture}`);
const endTag = new RegExp(`^<\\/${qnameCapture}[^>]*>`);
const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s""=<>]+)))?/;
const startTagClose = /^\s*(\/?)>/;
const defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/g;

/**
 * 创建ast对象
 * @param {*} tag 
 * @param {*} attrs 
 * @returns 
 */
function createASTElement(tag, attrs) {
  return {
    tag,
    attrs,
    children: [],
    type: 1,
    parent: null,
  }
}
let root; // 根节点
let createParent; // 当前元素父节点
let stack = []; //? 栈存储结果含义：[div,h,span] h是span的父节点

/**
 * 开始标签
 * @param {*} tag 标签名称
 * @param {*} attrs 标签属性
 */
function start(tag, attrs) {
  let element = createASTElement(tag, attrs);
  if (!root) {
    root = element;
  }
  createParent = element;
  stack.push(element);
}

/**
 * 获取文本
 * @param {*} text  文本
 */
function charts(text) {
  // text = text.replace(/a/g, '');
  if (text) {
    createParent.children.push({
      type: 3,
      text,
    })
  }
}

/**
 * 结束标签
 */
function end(tag) {
  let element = stack.pop();
  createParent = stack[stack.length - 1];
  if (createParent) {
    element.parent = createParent.tag;
    createParent.children.push(element);
  }
}

/**
 * 转换ast语法书
 * @param {*} html  html文本 
 */
export function parseHTML(html) {

  while (html) {
    let textEnd = html.indexOf('<');
    // 标签
    if (textEnd === 0) {
      // 开始标签
      const startTagMatch = parseStartTag();
      if (startTagMatch) {
        start(startTagMatch.tagName, startTagMatch.attrs);
        continue;
      }
      // 结束标签
      let endTagMatch = html.match(endTag);
      if (endTagMatch) {
        advance(endTagMatch[0].length);
        end(endTagMatch[1]);
        continue;
      }
    }
    // 文本
    let text;
    if (textEnd > 0) {
      text = html.substring(0, textEnd);
    }
    if (text) {
      advance(text.length);
      charts(text);
    }
  }

  /**
   * 获取开始dom节点
   */
  function parseStartTag() {
    const start = html.match(startTagOpen);
    if (start) {
      let match = { tagName: start[1], attrs: [] };
      // 删除节点
      advance(start[0].length);
      let attr, end;

      while (!(end = html.match(startTagClose)) && (attr = html.match(attribute))) {
        match.attrs.push({ name: attr[1], value: attr[3] || attr[4] || attr[5] });
        // 删除节点
        advance(attr[0].length);
      }
      if (end) {
        advance(end[0].length);
        return match;
      }
    }
  }

  /**
   * 删除dom节点
   * @param {*} n 删除位置
   */
  function advance(n) {
    html = html.substring(n);
    // console.log(html)
  }
  console.log(root);
  return root;

}